home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Libraries / GUSI / Examples / GUSITest.c < prev    next >
Text File  |  1993-09-11  |  4KB  |  236 lines

  1. /*********************************************************************
  2. File        :    GUSI                -    Grand Unified Socket Interface
  3. File        :    GUSITest.c        -    Common testing gear
  4. Author    :    Matthias Neeracher <neeri@iis.ethz.ch>
  5. Started    :    25Jul92                                Language    :    MPW C
  6.                 08Sep92    MN    Factor out more common code
  7.                 20Sep92    MN    Allow empty lines & comments
  8. Last        :    20Sep92
  9. *********************************************************************/
  10.  
  11. #include <Memory.h>
  12. #include <QuickDraw.h>
  13. #include <GUSITest.h>
  14. #include <Types.h>
  15. #include <stdio.h>
  16. #include <fcntl.h>
  17. #include <string.h>
  18. #include <sys/errno.h>
  19.  
  20. Boolean     HellHoundOnMyTrail = true;            /* Gotta keep on moving */
  21. char        infilename[200];
  22. char *    inputfrom;
  23. FILE *    input;
  24. int        inputline;
  25. CmdDef     commands[NROFCMDS];
  26.     
  27. void Help(char, char, const char *)
  28. {
  29.     char ch1,ch2;
  30.     
  31.     printf("Commands are:\n\n");
  32.     
  33.     for (ch1 = 'a'; ch1 <= 'z'; ++ch1)
  34.         for (ch2 = 0; ch2 <= 'z'; ch2 ? ++ch2 : (ch2 = 'a'))
  35.             if (HELPMSG(ch1,ch2))
  36.                 printf(
  37.                     "\t%c%c %-25s -- %s\n", 
  38.                     ch1, 
  39.                     ch2 ? ch2 : ' ', 
  40.                     USAGE(ch1,ch2), 
  41.                     HELPMSG(ch1,ch2));
  42.     
  43.     printf("\n");
  44. }
  45.  
  46. void Where()
  47. {
  48.     if (inputfrom)
  49.         printf("File '%s'; Line %d\n", inputfrom, inputline);
  50. }
  51.  
  52. void Prompt()
  53. {
  54.     extern int StandAlone;
  55.  
  56.     if (!inputfrom)
  57.         printf("[%d]%c", inputline, StandAlone ? ' ' : '\n');
  58. }
  59.  
  60. #define CASE(code)    case code: return #code
  61.  
  62. const char * Explain()
  63. {
  64.     switch (errno) {
  65.     CASE(EPERM);
  66.     CASE(ENOENT);
  67.     CASE(ESRCH);
  68.     CASE(EINTR);
  69.     CASE(EIO);
  70.     CASE(ENXIO);
  71.     CASE(E2BIG);
  72.     CASE(ENOEXEC);
  73.     CASE(EBADF);
  74.     CASE(ECHILD);
  75.     CASE(EDEADLK);
  76.     CASE(ENOMEM);
  77.     CASE(EACCES);
  78.     CASE(EFAULT);
  79.     CASE(ENOTBLK);
  80.     CASE(EBUSY);
  81.     CASE(EEXIST);
  82.     CASE(EXDEV);
  83.     CASE(ENODEV);
  84.     CASE(ENOTDIR);
  85.     CASE(EISDIR);
  86.     CASE(EINVAL);
  87.     CASE(ENFILE);
  88.     CASE(EMFILE);
  89.     CASE(ENOTTY);
  90.     CASE(ETXTBSY);
  91.     CASE(EFBIG);
  92.     CASE(ENOSPC);
  93.     CASE(ESPIPE);
  94.     CASE(EROFS);
  95.     CASE(EMLINK);
  96.     CASE(EPIPE);
  97.     CASE(EDOM);
  98.     CASE(ERANGE);
  99.     CASE(EWOULDBLOCK);
  100.     CASE(EINPROGRESS);
  101.     CASE(EALREADY);
  102.     CASE(ENOTSOCK);
  103.     CASE(EDESTADDRREQ);
  104.     CASE(EMSGSIZE);
  105.     CASE(EPROTOTYPE);
  106.     CASE(ENOPROTOOPT);
  107.     CASE(EPROTONOSUPPORT);
  108.     CASE(ESOCKTNOSUPPORT);
  109.     CASE(EOPNOTSUPP);
  110.     CASE(EPFNOSUPPORT);
  111.     CASE(EAFNOSUPPORT);
  112.     CASE(EADDRINUSE);
  113.     CASE(EADDRNOTAVAIL);
  114.     CASE(ENETDOWN);
  115.     CASE(ENETUNREACH);
  116.     CASE(ENETRESET);
  117.     CASE(ECONNABORTED);
  118.     CASE(ECONNRESET);
  119.     CASE(ENOBUFS);
  120.     CASE(EISCONN);
  121.     CASE(ENOTCONN);
  122.     CASE(ESHUTDOWN);
  123.     CASE(ETOOMANYREFS);
  124.     CASE(ETIMEDOUT);
  125.     CASE(ECONNREFUSED);
  126.     CASE(ELOOP);
  127.     CASE(ENAMETOOLONG);
  128.     CASE(EHOSTDOWN);
  129.     CASE(EHOSTUNREACH);
  130.     CASE(ENOTEMPTY);
  131.     CASE(EPROCLIM);
  132.     CASE(EUSERS);
  133.     CASE(EDQUOT);
  134.     CASE(ESTALE);
  135.     CASE(EREMOTE);
  136.     CASE(EBADRPC);
  137.     CASE(ERPCMISMATCH);
  138.     CASE(EPROGUNAVAIL);
  139.     CASE(EPROGMISMATCH);
  140.     CASE(EPROCUNAVAIL);
  141.     CASE(ENOLCK);
  142.     CASE(ENOSYS);
  143.     default:
  144.         return "Unknown";
  145.     }        
  146. }
  147.  
  148. void Usage(char ch1, char ch2)
  149. {
  150.     printf("# Usage is: %c%c %s\n", ch1, ch2 ? ch2 : ' ', USAGE(ch1,ch2));
  151.     Where();
  152. }
  153.  
  154. void Dispatch(const char * command)
  155. {
  156.     char        ch1    =    command[0];
  157.     char        ch2    =    command[1];
  158.     TestCmd    exec;
  159.     
  160.     /* We are guaranteed to have at least one valid character */
  161.     
  162.     switch (ch1) {
  163.     case '\n':
  164.     case '#':
  165.         return;
  166.     }
  167.  
  168.     if (!ch2)
  169.         ++command;
  170.     else {
  171.         if (isspace(ch2))    {
  172.             command    +=    1;
  173.             ch2        =    0;
  174.         } else
  175.             command    +=    2;
  176.         
  177.         /* Skip rest of first word */    
  178.         for (; *command && !isspace(*command); ++command);
  179.         
  180.         /* Skip whitespace */
  181.         while (isspace(*command))
  182.             ++command;
  183.     }
  184.     
  185.     if (isalpha(ch1) && (!ch2 || isalpha(ch2)) && (exec = DISPATCH(ch1,ch2)))
  186.         exec(ch1, ch2, command);
  187.     else {
  188.         if (ch2)
  189.             printf("# Unknown command: '%c%c'\n", ch1, ch2);
  190.         else
  191.             printf("# Unknown command: '%c'\n", ch1);
  192.             
  193.         printf("# Type 'h' for a list of known commands.\n"); 
  194.         
  195.         Where();
  196.     }
  197. }
  198.  
  199. void Quit(char, char, const char *)
  200. {
  201.     HellHoundOnMyTrail = false;
  202. }
  203.  
  204. void RunTest(int argc, char ** argv)
  205. {
  206.  
  207.     char         cmd[80];
  208.  
  209.     COMMAND('h',   0, Help,  "",                         "Print this list");
  210.     COMMAND('q',   0, Quit,  "",                         "End the sad existence of this program");
  211.  
  212.     InitGraf((Ptr) &qd.thePort);
  213.  
  214.     if (!--argc)
  215.         Help('h', 0, "");
  216.     
  217.     do {
  218.         if (argc && strcmp(inputfrom = *++argv, "-"))    {
  219.             printf("Executing %s…\n", inputfrom);
  220.             input          =    fopen(inputfrom, "r");
  221.         } else {
  222.             inputfrom    =    0;
  223.             input            =    stdin;
  224.         }
  225.  
  226.         inputline    =    1;
  227.         
  228.         while (HellHoundOnMyTrail && (Prompt(), fgets(cmd, 80, input)))    {
  229.             Dispatch(cmd);
  230.             ++inputline;
  231.         }
  232.     } while (HellHoundOnMyTrail && --argc > 0);
  233.         
  234.     printf("So long, it's been good to know you.\n");
  235. }
  236.